//npm run store menus.json
//文件路径固定为 "src/testFolder/"
const fs = require("fs-extra");
const fsJson = require("fs-extra/lib/json/jsonfile");
const path = require("path");

/*
 1. fs.stat 检测是文件还是目录(目录 文件是否存在)
 2. fs.mkdir 创建目录 （创建之前先判断是否存在）
 3. fs.writeFile 写入文件(文件不存在就创建,但不能创建目录)
 4. fs.appendFile 写入追加文件
 5. fs.readFile 读取文件
 6. fs.readdir 读取目录
 7. fs.rename 重命名
 8. fs.rmdir 删除目录
 9. fs.unlink 删除文件
 */
/**
 * 文件生成器
 */
class Storage {
	constructor(opt) {
		let options = Object.assign({
			filePath: "src/temp/",
			componentName: "",
			content: {}
		}, opt);
		this.generateFile(options.filePath, options.componentName, JSON.stringify(options.content));
	}

	/**
	 * 生成文件
	 * @param {*} filePath 文件路径
	 * @param componentName 文件名 menu.json
	 * @param content 文件内容数据
	 */
	generateFile(filePath, componentName, content) {
		const folderPath = path.resolve(process.cwd(), filePath);
		// 固定后缀 .json
		const pointIndex = componentName.lastIndexOf(".");
		if (!/\.json$/.test(componentName)) {
			if (pointIndex !== -1) {
				componentName = componentName.substr(0, pointIndex) + ".json";
			} else {
				componentName = componentName + ".json";
			}
		}
		if (this.createFolder(folderPath)) {
			const writeResult = this.writeFile(folderPath, componentName, content);
			if (writeResult && writeResult.success) {
				console.log("Success 成功写入文件: ", componentName);
				console.log(fs.readFileSync(`${folderPath}/${componentName}`, "utf8"));
			}
		}
	}

	/**
	 * 检测目录是否存在,不存在创建
	 * @param {*} folderPath 目录路径
	 */
	checkFolderExist(folderPath) {
		try {// file exists
			if (fs.existsSync(folderPath)) {
				return true;
			}
		} catch (err) {
			return false;
		}
		return false;
	}

	/**
	 * 检测目录是否存在,不存在创建
	 * @param {*} folderPath 路径名
	 */
	createFolder(folderPath) {
		const folderExist = this.checkFolderExist(folderPath);
		if (!folderExist) {
			try {// 创建目录
				fs.mkdirSync(folderPath);
				console.log("创建目录成功");
				return true;
			} catch (error) {
				console.log(error);
				return false;
			}
		}
		return true;
	}

	/**
	 * 写入数据
	 * @param {*} folderPath 路径名
	 * @param {*} componentName 文件名
	 * @param content 文件内容数据
	 */
	writeFile(folderPath, componentName, content) {
		try {
			const filePath = `${folderPath}/${componentName}`;
			fs.writeFileSync(filePath, content, "utf8");
			return {success: true};
		} catch (error) {
			return {success: false, error};
		}
	}
}

module.exports = Storage;
